// @import
import HeroCtrl from "./HeroCtrl";
import MyResLoader from "../comm/base/MyResLoader";

// @const
const AVATAR_AND_HERO_ID_MAP = {};

(function () {
    AVATAR_AND_HERO_ID_MAP["hero_hammer"] = 1001;
    AVATAR_AND_HERO_ID_MAP["hammer"] = 1001;
    AVATAR_AND_HERO_ID_MAP["hero_shaman"] = 1002;
    AVATAR_AND_HERO_ID_MAP["shaman"] = 1002;
    AVATAR_AND_HERO_ID_MAP["hero_skeleton"] = 1003;
    AVATAR_AND_HERO_ID_MAP["skeleton"] = 1003;
})();

/**
 * 英雄控件工厂类
 */
export default class HeroCtrlFactory {
    /**
     * 私有化类默认构造器
     */
    private constructor() {
    }

    /**
     * 根据形象创建英雄
     * 
     * @param strAvatar 形象字符串
     * @param funCb 回调函数
     */
    static createByAvatar(strAvatar: string, funCb: (oNewHeroNode: cc.Node) => void): void {
        // 将字符串全小写
        strAvatar = strAvatar.toLowerCase();

        this.create(
            AVATAR_AND_HERO_ID_MAP[strAvatar], 
            funCb
        );
    }

    /**
     * 根据 ID 创建英雄
     * 
     * @param nHeroID 英雄 Id
     * @param funCb 回调函数
     */
    static create(nHeroID: number, funCb: (oNewHeroNode: cc.Node) => void): void {
        if (nHeroID <= 0) {
            return;
        }

        // 预制体路径
        let strPrefabURI: string = `hero/${nHeroID}/prefab/${nHeroID}`;

        // 加载英雄资源
        MyResLoader.loadLocalRes(strPrefabURI, (oPrefab) => {
            if (!oPrefab) {
                console.error(`预制体为空, prefabURI = ${strPrefabURI}`);
                return;
            }

            // 创建英雄
            let oNewHeroNode: cc.Node = cc.instantiate(oPrefab as cc.Prefab);
            oNewHeroNode.addComponent(HeroCtrl);

            funCb(oNewHeroNode);
        });
    }
}
